/*
 * @Author: 我想吃余 483766615@qq.com
 * @Date: 2025-10-31 17:09:33
 * @LastEditors: 我想吃余 483766615@qq.com
 * @LastEditTime: 2025-11-04 16:16:37
 * @FilePath: /oscode/signal/sigtest.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

using namespace std;

void PrintPending()
{
    sigset_t set;
    sigpending(&set);
    for(int i = 1; i < 32; i++)
    {
        if(sigismember(&set, i))
            cout<<"1";
        else 
            cout<<"0";
    }
    cout<<endl;
}

void sigcb(int signo)
{
    cout << "catch signal success! signal number:" << signo << endl;
    //打印pending表
    while(true)
    {
        PrintPending();
        sleep(1);
    }
}

// int main()
// {
//     struct sigaction act;
//     struct sigaction oact;
//     memset(&act, 0, sizeof(act));
//     memset(&oact, 0, sizeof(oact));
//     sigaddset(&act.sa_mask, 3);
//     sigaddset(&act.sa_mask, 1);
//     act.sa_handler = sigcb;
//     sigaction(2, &act, &oact);
//     while(true)
//     {
//         cout << "I am process……" << getpid() << endl;
//         sleep(1);
//     }

//     return 0;
// }

void handler(int signo)
{
    cout << "catch signal success! signal number:" << signo << endl;
}

int main()
{
    //捕捉所有普通信号
    // int cnt = 1;
    // while(cnt <= 31)
    // {
    //     signal(cnt, hander);
    //     cnt++;
    // }
    // signal(6, hander);
    // while(true)
    // {
    //     cout << "I am process……" << getpid() << endl;
    //     sleep(1);
    //     //发送2号信号
    //     //raise(2);

    //     //发送6号信号
    //     abort();
    // }
    sigset_t set, oset;
    sigemptyset(&set);
    sigaddset(&set, 2);
    sigaddset(&set, 40);
    sigprocmask(SIG_BLOCK, &set, &oset);
    signal(2, handler);
    signal(40, handler);
    int cnt = 5;
    while(cnt)
    {
        kill(getpid(), 2);
        kill(getpid(), 40);
        cnt--;
    }

    return 0;
}


// void handler(int signo)
// {
//     sleep(1);
//     pid_t rid;
//     while ((rid = waitpid(-1, nullptr, WNOHANG)) > 0)
//     {
//         cout << "I am proccess: " << getpid() << " catch a signo: " << signo << "child process quit: " << rid << endl;
//     }
// }

// int main()
// {
//     signal(17, SIG_IGN); // SIG_DFL -> action -> IGN
//     //signal(17, handler);
//     for (int i = 0; i < 10; i++)
//     {
//         pid_t id = fork();
//         if (id == 0)
//         {
//             while (true)
//             {
//                 cout << "I am child process: " << getpid() << ", ppid: " << getppid() << endl;
//                 sleep(1);
//                 break;
//             }
//             cout << "child quit!!!" << endl;
//             exit(0);
//         }
//         sleep(1);
//     }
//     // father
//     while (true)
//     {
//         cout << "I am father process: " << getpid() << endl;
//         sleep(1);
//     }

//     return 0;
// }